// 导入相关包和类  
package com.example.student_manager_backend.controller;

import com.example.student_manager_backend.entity.Class;
import com.example.student_manager_backend.entity.Student;
import com.example.student_manager_backend.service.ClassService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;


@RestController
@RequestMapping("/api/classes")
public class ClassController {

    @Autowired
    private ClassService classService; // 注入班级服务层  

    /**
     * 创建一个新班级  
     * 请求类型：POST /api/classes  
     *
     * @param classEntity 请求体中传入的班级对象  
     * @return 返回创建成功的班级对象
     */
    @PostMapping
    public ResponseEntity<Class> createClass(@RequestBody Class classEntity) {
        // 调用服务层创建班级  
        Class createdClass = classService.createClass(classEntity);
        // 返回HTTP 200，包含新建班级  
        return ResponseEntity.ok(createdClass);
    }

    /**
     * 根据班级编号更新班级信息  
     * 请求类型：PUT /api/classes/{classId}
     *
     * @param classId 需要更新的班级编号（路径参数）
     * @param classEntity 请求体中的班级信息（新信息）
     * @return 返回更新后的班级，如果不存在则返回404
     */
    @PutMapping("/{classId}")
    public ResponseEntity<Class> updateClass(@PathVariable String classId, @RequestBody Class classEntity) {
        // 调用服务层更新班级信息  
        Class updatedClass = classService.updateClass(classId, classEntity);
        if (updatedClass != null) {
            // 更新成功，返回该班级  
            return ResponseEntity.ok(updatedClass);
        }
        // 未找到对应的班级，返回404  
        return ResponseEntity.notFound().build();
    }

    /**
     * 删除指定编号的班级  
     * 请求类型：DELETE /api/classes/{classId}
     *
     * @param classId 要删除的班级编号  
     * @return 操作成功返回空响应
     */
    @DeleteMapping("/{classId}")
    public ResponseEntity<Void> deleteClass(@PathVariable String classId) {
        // 调用服务层删除班级  
        classService.deleteClass(classId);
        // 返回200状态，但无内容  
        return ResponseEntity.ok().build();
    }

    /**
     * 条件分页查询班级列表  
     * 请求类型：GET /api/classes  
     *
     * @param spec 查询条件（通过Specification，支持复杂过滤）  
     * @param pageable 分页参数（页面大小等）  
     * @return 返回分页的班级列表
     */
    @GetMapping
    public ResponseEntity<Page<Class>> findClasses(
            Specification<Class> spec,
            @PageableDefault(size = 10) Pageable pageable) {
        // 调用服务层查询（支持过滤和分页）  
        Page<Class> classes = classService.findClasses(spec, pageable);
        // 返回分页结果  
        return ResponseEntity.ok(classes);
    }

    /**
     * 根据班级编号查询班级详细信息  
     * 请求类型：GET /api/classes/{classId}
     *
     * @param classId 班级编号
     * @return 如果找到，返回班级对象，否则返回404
     */
    @GetMapping("/{classId}")
    public ResponseEntity<com.example.student_manager_backend.entity.Class> findClassById(@PathVariable String classId) {
        return classService.findClassById(classId)
                // 如果返回值是Optional，成功时包装为响应体  
                .map(ResponseEntity::ok)
                // 否则返回404  
                .orElse(ResponseEntity.notFound().build());
    }



    /**
     * 根据班级编号获取班级的所有学生
     * 请求类型：GET /api/classes/{classId}/students
     *
     * @param classId 班级编号
     * @return 返回该班级所有学生的列表
     */
    @GetMapping("/{classId}/students")
    public ResponseEntity<List<Student>> findStudentsByClassId(@PathVariable String classId) {
        // 调用服务层查询这个班级的所有学生
        List<com.example.student_manager_backend.entity.Student> students = classService.findStudentsByClassId(classId);
        // 返回学生列表
        return ResponseEntity.ok(students);
    }
}